/**
 * Tabs 标签页 Store
 * 管理多标签页的打开、关闭、切换等操作
 */
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import router from '@/router'

export const useTabsStore = defineStore('tabs', () => {
  // 🎯 状态
  const tabs = ref([])  // 标签页列表
  const activeTab = ref('')  // 当前激活的标签页路径
  
  // 🎯 固定首页标签（不可关闭）
  const homeTab = {
    path: '/dashboard',
    name: 'Dashboard',
    title: '仪表板',
    icon: 'Odometer',
    closable: false  // 首页不可关闭
  }
  
  // 🎯 计算属性
  const tabsList = computed(() => tabs.value)
  const activeTabPath = computed(() => activeTab.value)
  
  /**
   * 初始化标签页（添加首页）
   */
  function initTabs() {
    if (tabs.value.length === 0) {
      tabs.value = [homeTab]
      activeTab.value = homeTab.path
    }
  }
  
  /**
   * 添加标签页
   * @param {Object} route - 路由对象
   */
  function addTab(route) {
    // 过滤掉不需要显示的路由
    if (route.meta?.hideInMenu || route.path === '/login' || route.path === '/404') {
      return
    }
    
    const tab = {
      path: route.path,
      name: route.name,
      title: route.meta?.title || route.name || '未命名',
      icon: route.meta?.icon,
      closable: route.path !== '/dashboard'  // 首页不可关闭
    }
    
    // 检查是否已存在
    const existIndex = tabs.value.findIndex(t => t.path === tab.path)
    
    if (existIndex === -1) {
      // 不存在则添加
      tabs.value.push(tab)
    } else {
      // 存在则更新标题（可能路由信息变化）
      tabs.value[existIndex] = { ...tabs.value[existIndex], ...tab }
    }
    
    // 设置为激活标签
    activeTab.value = tab.path
  }
  
  /**
   * 移除标签页
   * @param {string} path - 要关闭的标签页路径
   */
  function removeTab(path) {
    // 首页不可关闭
    if (path === '/dashboard') {
      return
    }
    
    const index = tabs.value.findIndex(t => t.path === path)
    
    if (index === -1) {
      return
    }
    
    // 如果关闭的是当前激活的标签
    if (path === activeTab.value) {
      // 跳转到相邻标签
      const nextTab = tabs.value[index + 1] || tabs.value[index - 1] || homeTab
      router.push(nextTab.path)
    }
    
    // 移除标签
    tabs.value.splice(index, 1)
  }
  
  /**
   * 关闭其他标签页
   * @param {string} path - 要保留的标签页路径
   */
  function closeOtherTabs(path) {
    tabs.value = tabs.value.filter(tab => 
      tab.path === path || tab.path === '/dashboard'
    )
    
    // 如果当前激活的标签被关闭，跳转到保留的标签
    if (!tabs.value.find(t => t.path === activeTab.value)) {
      router.push(path)
    }
  }
  
  /**
   * 关闭左侧标签页
   * @param {string} path - 参考标签页路径
   */
  function closeLeftTabs(path) {
    const index = tabs.value.findIndex(t => t.path === path)
    
    if (index <= 0) {
      return
    }
    
    // 保留首页和当前标签右侧的所有标签
    tabs.value = [
      homeTab,
      ...tabs.value.slice(index)
    ]
    
    // 如果当前激活的标签被关闭，跳转到参考标签
    if (!tabs.value.find(t => t.path === activeTab.value)) {
      router.push(path)
    }
  }
  
  /**
   * 关闭右侧标签页
   * @param {string} path - 参考标签页路径
   */
  function closeRightTabs(path) {
    const index = tabs.value.findIndex(t => t.path === path)
    
    if (index === -1 || index === tabs.value.length - 1) {
      return
    }
    
    // 保留首页到当前标签的所有标签
    tabs.value = tabs.value.slice(0, index + 1)
    
    // 如果当前激活的标签被关闭，跳转到参考标签
    if (!tabs.value.find(t => t.path === activeTab.value)) {
      router.push(path)
    }
  }
  
  /**
   * 关闭所有标签页（保留首页）
   */
  function closeAllTabs() {
    tabs.value = [homeTab]
    router.push(homeTab.path)
  }
  
  /**
   * 设置激活标签
   * @param {string} path - 标签页路径
   */
  function setActiveTab(path) {
    activeTab.value = path
  }
  
  /**
   * 刷新当前标签页
   */
  async function refreshTab(path) {
    // 通过路由重载实现刷新
    const currentPath = path || activeTab.value
    
    // 先跳转到一个空白路由，再跳回来
    await router.replace({ path: '/redirect' + currentPath })
  }
  
  /**
   * 重置标签页
   */
  function resetTabs() {
    tabs.value = [homeTab]
    activeTab.value = homeTab.path
  }
  
  return {
    // 状态
    tabs,
    activeTab,
    homeTab,
    
    // 计算属性
    tabsList,
    activeTabPath,
    
    // 方法
    initTabs,
    addTab,
    removeTab,
    closeOtherTabs,
    closeLeftTabs,
    closeRightTabs,
    closeAllTabs,
    setActiveTab,
    refreshTab,
    resetTabs
  }
}, {
  persist: {
    key: 'vilan-tabs',
    storage: localStorage,
    paths: ['tabs', 'activeTab']
  }
})

